
/* ********************************************************************* */
/*                                                                       */
/*                       Librairies de Etudiant                          */
/*                                                                       */
/* ********************************************************************* */

#include "Etudiant.h"
#include "Chemin.h"

/* ********************************************************************* */
/*                                                                       */
/*                        Les Fonctions                                  */
/*                                                                       */
/* ********************************************************************* */


void initEtu(Etu *etu, const int numEtu, const char *nomEtu, const char *prenomEtu)
{
 	assert(etu != NULL) ;

    setNumEtu(etu,numEtu);
    setNomEtu(etu,nomEtu);
    setPrenomEtu(etu,prenomEtu);
}

Etu * creEtu(const int numEtu,const char *nomEtu, const char *prenomEtu)
{
	Etu *etu= (Etu *) calloc(1,sizeof(Etu));
	initEtu(etu, numEtu, nomEtu, prenomEtu) ;

    return etu;
}

void libEtu(Etu *etu)
{
   	etu->numEtu     = 0 ;
   	etu->nomEtu     = NULL;
	etu->prenomEtu  = NULL;
}

void detEtu(Etu ** etu)
{
    assert(*etu != NULL);

    libEtu(*etu);
    free(*etu);
    *etu = NULL ;
}

/* ******************************************************************** */
/*																		*/
/*           Accesseurs et Mutateurs de la structure Etudiant           */
/*																		*/
/* ******************************************************************** */

int getNumEtu(const Etu *etu)
{
    if(etu && (etu->numEtu>0))
        return etu->numEtu;
    else
        return 0;
}

void setNumEtu(Etu *etu,const int numEtu)
{
    assert(numEtu>0);
    assert(etu!=NULL);
    etu->numEtu=numEtu;
}

char *getNomEtu(const Etu *etu)
{
    if(etu && (etu->nomEtu != NULL))
        return etu->nomEtu;
    else
        return NULL;
}

void setNomEtu(Etu * etu,const char * nomEtu)
{
    assert(nomEtu!=NULL);
    assert(etu!=NULL);
    etu->nomEtu=(char *)nomEtu;
}

char *getPrenomEtu(const Etu *etu)
{
    if(etu && (etu->prenomEtu != NULL))
        return etu->prenomEtu;
    else
        return NULL;
}

void setPrenomEtu(Etu * etu,const char * prenomEtu)
{
    assert(prenomEtu!=NULL);
    assert(etu!=NULL);
    etu->prenomEtu=(char *)prenomEtu;
}

void affEtu(const Etu *etu)
{
	if(etu!=NULL && etu->nomEtu!=NULL && etu->prenomEtu!=NULL && etu->numEtu>0)
	{
		printf("Numero Etudiant: %d\n",etu->numEtu);
		printf("Nom Etudiant: %s\n" ,etu->nomEtu);
		printf("Prenom Etudiant: %s\n",etu->prenomEtu);
	}
	else
	{
		printf("\nAucun Etudiant!!");
	}
}

/* ********************************************************************* */
/*                                                                       */
/*             Fonctions relatives aux gestiond'Etu                       */
/*                                                                       */
/* ********************************************************************* */


void savEtuParElem(const int numEtu,const char * nomEtu, const char * prenomEtu)
{
    FILE* f;
    f = fopen(ETU_DB, "a");/*creation du fichier s'il n'existe pas*/
    fclose(f);


    if(rchEtuParCode(numEtu) == 0)
    {
        f = fopen(ETU_DB, "a");
        char*cnum=calloc(20,sizeof(char));
        sprintf(cnum,"%d",numEtu);
        char*chaine=calloc(100,sizeof(char));

         strcat(chaine,cnum);
        strcat(chaine,":");
        strcat(chaine,nomEtu);
        strcat(chaine,":");
        strcat(chaine,prenomEtu);
        strcat(chaine,"\n");

        fputs(chaine, f);
         fclose(f);

        free(cnum);
        free(chaine);

    }
    else
    {
        printf("Etudiant deja present dans la base de donnée!!!!!\n");
    }
}

void savEtu(Etu*etu)
{
    assert(etu!=NULL&&etu->numEtu>0&&etu->nomEtu!=NULL&&etu->prenomEtu!=NULL);
    savEtuParElem(etu->numEtu,etu->nomEtu,etu->prenomEtu);
}

int rchEtuParCode(const int numEtu)
{
    FILE* f;
    f=fopen(ETU_DB,"a");
    fclose(f);

    f = fopen(ETU_DB, "r");

    if (f==NULL)
    {
        printf("Erreur lors de l'ouverture de %s\n",ETU_DB);
        exit(EXIT_FAILURE);
    }
    char* contenu=calloc(100,sizeof(char));  /* déclaration d'une chaîne qui contiendra la ligne lue*/

    while(fgets(contenu,100,f)!=NULL)
    {
        char**tabor=g_strsplit((gchar*)contenu,(gchar*)"\n",100);
        char**tab=g_strsplit((gchar*)tabor[0],(gchar*)":",100);
        if(numEtu == atoi(tab[0]))
        {
            fclose(f);
            return 1;
        }
        free(tab);
    }
    free(contenu);

    if(!feof(f))
        printf("autre probleme \n");

    fclose(f);
    return 0;
}


Etu *recEtuParCode(const int numEtu)
{
    FILE* f;
    f=fopen(ETU_DB,"a");
    fclose(f);

    f = fopen(ETU_DB, "r");

    if (f==NULL)
    {
        printf("Erreur lors de l'ouverture de %s\n", ETU_DB);
        exit(EXIT_FAILURE);
    }

     char* contenu=calloc(100,sizeof(char));  /* déclaration d'une chaîne qui contiendra la ligne lue*/

    while(fgets(contenu,100,f)!=NULL)
    {
        char**tabor=g_strsplit((gchar*)contenu,(gchar*)"\n",100);
        char**tab=g_strsplit((gchar*)tabor[0],(gchar*)":",100);

        if(numEtu == atoi(tab[0]))
        {
            fclose(f);
            char*   nom=calloc(20,sizeof(char));
            char*   prenom=calloc(20,sizeof(char));
            strcpy(nom,tab[1]);
            strcpy(prenom,tab[2]);
            int num=atoi(tab[0]);
            free(tabor);
            free(tab);
            return creEtu(num,nom,prenom);
        }
        free(tabor);
        free(tab);
    }
    free(contenu);

    if(!feof(f))
        printf("autre probleme \n");

    fclose(f);
    return NULL;
}


int supEtuParCode(const int numEtu)
{
    char *contenu=calloc(100,sizeof(char));
    FILE * fIn;
    FILE * fOut;

    if ((fIn = fopen(ETU_DB, "r")) == NULL)
        return EXIT_FAILURE;

    if ((fOut = fopen("texte.tmp", "w")) == NULL)
    {
        fclose(fIn);
        return EXIT_FAILURE;
    }

    while (fgets(contenu,100, fIn))
    {
        char * ligne=calloc(100,sizeof(char));
        copStr(&ligne,contenu);
        char**tabor=g_strsplit((gchar*)contenu,(gchar*)"\n",100);
        char**tab=g_strsplit((gchar*)tabor[0],(gchar*)":",100);
        if (atoi(tab[0]) != numEtu)
                    fputs(ligne, fOut);
        free(tabor);
        free(tab);
    }
    free(contenu);

    fclose(fIn);
    fclose(fOut);

    rename("texte.tmp", ETU_DB);
    return 0;
}

int supEtu(Etu*etu)
{
    assert(etu!=NULL);
    assert(etu->numEtu>0);
    return  supEtuParCode(etu->numEtu);
}


int modifEtu(Etu*etu,Etu*etunew)
{
    assert(etu!=NULL);
    assert(etunew!=NULL);
    assert(etu->numEtu>0    &&  etunew->numEtu>0);
    assert(etu->numEtu==etunew->numEtu);

    return  mdfEtuParCode(etu->numEtu,etunew);
}

int mdfEtuParCode(const int numEtu, Etu *pEtu)
{
   if(supEtuParCode(numEtu)==0)
   {
       savEtu(pEtu);
       return 0;
   }
   return -1;
}


void affEtu_DB()
{
    FILE* f;

    f = fopen(ETU_DB, "r");

    if (f==NULL)
    {
        printf("Erreur lors de l'ouverture de %s\n", ETU_DB);
        exit(EXIT_FAILURE);
    }
    char*contenu=calloc(100,sizeof(char));
    while(fgets(contenu,100,f) != NULL)
    {
        char**tabor=g_strsplit((gchar*)contenu,(gchar*)"\n",100);
        char**tab=g_strsplit((gchar*)tabor[0],(gchar*)":",100);
        affEtu(creEtu(atoi(tab[0]),tab[1],tab[2]));
        free(tabor);
        free(tab);
    }
    free(contenu);

    if(!feof(f))
        printf("autre probleme \n");
    fclose(f);
}

/* ********************************************************************* */


void regEtu()
{
    Etu etu1,etu2;
    Etu *etu3, *etu4;

    printf("\n\nTest de regression du module Etudiant :\n") ;

	printf("\nTest de initEtudiant pour un etudiant de prenom prenomEtu1 ");
        initEtu(&etu1,111 ,"nomEtu1","prenomEtu1") ;
		affEtu(&etu1);
        printf("ok.\n") ;

	printf("\nTest de initEtudiant pour un etudiant de prenom prenomEtu2 :");
        initEtu(&etu2, 222,"nomEtu2","prenomEtu2") ;
		affEtu(&etu2);
        printf("ok.\n") ;

	printf("\nTest de libereEtudiant pour un l'etudiant etu1 de prenom prenomEtu1 :  ");
        libEtu(&etu1) ;
		printf("\nok.");
		printf("Affichage après liberation\n");
		affEtu(&etu1);
        printf("ok.\n") ;

	printf("\nTest de libereEtudiant pour un l'etudiant etu2 de prenom prenomEtu2 :  ");
      	libEtu(&etu2) ;
		printf("\nok.");
		printf("Affichage après liberation\n");
		affEtu(&etu2);
        printf("ok.\n") ;


	printf("\nTest de creerEtudiant pour un etudiant de prenom prenomEtu3 :  ");
        etu3=creEtu(333,"nomEtu3","prenomEtu3");
        affEtu(etu3);
        printf("ok.\n");


    printf("\nTest de savEtuParElem pour trois Etu  :  ");
		savEtuParElem(444, "nom4", "prenom4");
		savEtuParElem(555, "nom5", "prenom5");
		savEtuParElem(666, "nom6", "prenom6");
		savEtuParElem(777, "nom7", "prenom7");
        printf("OK.\n") ;

    printf("\nTest de affEtu_DB pour trois Etu  :  ");
        affEtu_DB();
        printf("OK.\n") ;

    printf("\nTest de supEtuParCode pour un Etu de numEtu 555:  ");
        supEtuParCode(555);
        affEtu_DB();
        printf("OK.\n") ;

    printf("\nTest de mdfEtuParCode pour un Etu de code 444 a 333   :  ");
        mdfEtuParCode(444, etu3);
        mdfEtuParCode(555, etu3);

        affEtu_DB();
        printf("OK.\n") ;

   printf("\nTest de recEtuParCode pour un Etu de code 666   :  ");
        etu4=recEtuParCode(666);
        affEtu(etu4);
        detEtu(&etu4);



	printf("\nTest de detruireEtudiant pour un l'etudiant etudiant  Etu3 ");

      	detEtu(&etu3) ;
    	printf("OK.\n") ;
		printf("Affichage apres destruction\n");
        affEtu(etu3);

        /*remove(ETU_DB);*/
	printf("\nTest de regression du module Etudiant terminé avec succés.\n\n") ;
}

